package com.naiterui.ehp.bs.im.service;

import com.naiterui.ehp.bp.bo.im.MsgSendParamBO;
import com.naiterui.ehp.bp.bo.im.SessionDetailBO;
import com.naiterui.ehp.bp.bo.im.SessionParamBO;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.im.exception.NaiteruiIMException;
import com.naiterui.ehp.bs.im.network.protocl.Disturb;
import com.naiterui.ehp.bs.im.network.protocl.Replay;
import com.naiterui.ehp.bs.im.network.protocl.SessionParams;
import com.naiterui.ehp.bs.im.network.protocl.Shield;
import com.naiterui.ehp.bs.im.vo.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * IM模块业务逻辑处理的相关操作
 */
public interface INaiteruiIMService {

    /**
     * 用于客户端动态的获取与MQTT服务器建立连接的参数
     */
    MqttConnectParam getMqttConnectionParams(int platform, Long userId, String token, String ip) throws NaiteruiIMException;

    /**
     * 消息发送 用于 医生端 与 患者端的消息发送 该方法会调用相关组件进行如下操作
     */
    MessageVO sendMessage(int platform, String message) throws BusinessException;

    /**
     * 消息上传 用于 医生端的多媒体消息的上传 目前多媒体消息主要分三种格式 图片、音频、小视频 该上传接口会返回客户端文件的相对路径
     *
     * @throws NaiteruiIMException
     */
    String uploadMediaData(MediaUploadVO mediaUpload, MultipartFile[] file) throws NaiteruiIMException;

    /**
     * 获取指定用户间的聊天记录 timegroup表示是否需要服务器提供时间分组
     */
    PageVO getChatHistory(int platform, QueryHistoryCondVO vo) throws BusinessException;

    /**
     * 获取用户的图片上传记录
     */
    PageVO<ImgTimeGroupVO> getImageUploadHistory(String userSign, Long patientId, Long doctorId, Integer page,
                                                 Integer num) throws NaiteruiIMException;

    /**
     * INaiteruiIMService.checkOrigin()
     */
    int checkOrigin(String originHeader) throws NaiteruiIMException;

    /**
     * INaiteruiIMService.checkPlatform()
     */
    int checkPlatform(String platformHeader) throws NaiteruiIMException;

    /**
     * 设置勿扰模式
     */
    void setDisturb(Disturb disturb, int operate) throws NaiteruiIMException;

    /**
     * 获取 勿扰模式时间
     */
    DisturbVO getDisturb(Long userId) throws NaiteruiIMException;

    /**
     * 设置屏蔽用户信息
     */
    void setShield(Shield shield, int operate) throws NaiteruiIMException;

    /**
     * 获取屏蔽列表
     */
    ShieldVO getShield(Long userId) throws NaiteruiIMException;

    ReplayVO setOrGetReplay(Replay replay, Integer opreate) throws NaiteruiIMException;

    /**
     * 按页获取session列表
     */
    PageVO<?> findSessionPageList(SessionParams params) throws NaiteruiIMException;

    /**
     * 获取session中的消息列表
     */
    PageVO<?> findMessagesBySession(String sessionId, Integer pageNo, Integer pageSize, Long endTime, Integer origin, Long doctorId, Long patientId) throws NaiteruiIMException;

    /**
     * 结束会话
     */
    SessionVO finishSession(SessionParams params) throws NaiteruiIMException;

    /**
     * session已支付状态 修改
     */
    void sessionPaid(String sessionId) throws NaiteruiIMException;

    SessionVO findSessionStatus(String sessionId) throws NaiteruiIMException;

    /**
     * 公共通知
     */
    void publicNotice(String message, String userType) throws NaiteruiIMException;

    /**
     * 私人通知
     */
    void privateNotice(String message, Long userId, Boolean force, String userType) throws NaiteruiIMException;

    /**
     * 付费咨询支付完成后的回调
     */
    SessionVO createConsultSessionAndNotice(ConsultInitVO consultInitVO) throws BusinessException;

    void sendMultipleMessage(String message, String toIds) throws NaiteruiIMException;

    PageVO<SessionDetailBO> sessionPageList(SessionParamBO params) throws NaiteruiIMException;

    /**
     * 发送系统消息
     * @param msgSendParamBO
     * @throws BusinessException
     */
    void sendSysMessage(MsgSendParamBO msgSendParamBO) throws BusinessException;
}
